package cn.iocoder.yudao.module.eval.service.statistics;

import cn.iocoder.yudao.module.eval.controller.admin.statistics.vo.*;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;

/**
 * 统计分析 Service 接口
 *
 * @author 芋道源码
 */
public interface EvalStatisticsService {

    /**
     * 企业评价概览
     *
     * @return 概览信息
     */
    EvalEnterpriseOverviewRespVO getEnterpriseOverview();

    /**
     * 企业计划统计
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 计划统计
     */
    EvalEnterprisePlanStatisticsRespVO getEnterprisePlanStatistics(String startDate, String endDate);

    /**
     * 企业参评人员统计
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 人员统计
     */
    EvalEnterpriseCandidateStatisticsRespVO getEnterpriseCandidateStatistics(String startDate, String endDate);

    /**
     * 企业职业覆盖统计
     *
     * @return 职业覆盖统计
     */
    EvalEnterpriseProfessionCoverageRespVO getEnterpriseProfessionCoverage();

    /**
     * 企业考评员统计
     *
     * @return 考评员统计
     */
    EvalEnterpriseEvaluatorStatisticsRespVO getEnterpriseEvaluatorStatistics();

    /**
     * 培训效果统计
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 培训效果统计
     */
    EvalTrainingEffectivenessRespVO getTrainingEffectiveness(String startDate, String endDate);

    /**
     * 企业月度趋势统计
     *
     * @param year 年份
     * @return 月度趋势列表
     */
    List<EvalEnterpriseMonthlyTrendRespVO> getEnterpriseMonthlyTrend(Integer year);

    /**
     * 跨企业数据总览（监管员）
     *
     * @return 监管概览
     */
    EvalSupervisionOverviewRespVO getSupervisionOverview();

    /**
     * 企业评价活动统计
     *
     * @param enterpriseId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 活动统计列表
     */
    List<EvalEnterpriseActivityStatisticsRespVO> getEnterpriseActivityStatistics(Long enterpriseId, String startDate, String endDate);

    /**
     * 职业分布统计
     *
     * @param region 地区
     * @param industry 行业
     * @return 职业分布列表
     */
    List<EvalProfessionDistributionRespVO> getProfessionDistribution(String region, String industry);

    /**
     * 评价质量分析
     *
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 质量分析
     */
    EvalQualityAnalysisRespVO getQualityAnalysis(String startDate, String endDate);

    /**
     * 区域对比分析
     *
     * @param regions 对比地区
     * @param year 年份
     * @return 区域对比列表
     */
    List<EvalRegionalComparisonRespVO> getRegionalComparison(String regions, Integer year);

    /**
     * 计划详细统计
     *
     * @param planId 计划ID
     * @return 详细统计
     */
    EvalPlanDetailedStatisticsRespVO getPlanDetailedStatistics(Long planId);

    /**
     * 职业评价分析
     *
     * @param professionCode 职业代码
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 职业分析
     */
    EvalProfessionAnalysisRespVO getProfessionAnalysis(String professionCode, String startDate, String endDate);

    /**
     * 考评员绩效分析
     *
     * @param evaluatorId 考评员ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 绩效分析
     */
    EvalEvaluatorPerformanceRespVO getEvaluatorPerformance(Long evaluatorId, String startDate, String endDate);

    /**
     * 导出企业统计报表
     *
     * @param reportType 报表类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param response 响应
     * @throws IOException IO异常
     */
    void exportEnterpriseReport(String reportType, String startDate, String endDate, HttpServletResponse response) throws IOException;

    /**
     * 导出监管统计报表
     *
     * @param reportType 报表类型
     * @param region 地区
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param response 响应
     * @throws IOException IO异常
     */
    void exportSupervisionReport(String reportType, String region, String startDate, String endDate, HttpServletResponse response) throws IOException;

    /**
     * 自定义统计查询
     *
     * @param queryReqVO 查询条件
     * @return 查询结果
     */
    EvalCustomStatisticsRespVO customStatisticsQuery(@Valid EvalCustomStatisticsReqVO queryReqVO);

    /**
     * 获取仪表盘组件数据
     *
     * @param widgetTypes 组件类型列表
     * @return 组件数据列表
     */
    List<EvalDashboardWidgetRespVO> getDashboardWidgets(String widgetTypes);

    /**
     * 获取实时指标
     *
     * @return 实时指标
     */
    EvalRealTimeMetricsRespVO getRealTimeMetrics();

    /**
     * 时期对比分析
     *
     * @param comparisonReqVO 对比条件
     * @return 对比结果
     */
    EvalPeriodComparisonRespVO comparePeriods(@Valid EvalPeriodComparisonReqVO comparisonReqVO);

    /**
     * 企业对比分析
     *
     * @param comparisonReqVO 对比条件
     * @return 对比结果
     */
    EvalEnterpriseComparisonRespVO compareEnterprises(@Valid EvalEnterpriseComparisonReqVO comparisonReqVO);

}
